home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et-2_2.lha / et2.2 / applications / draw / RcBoxShape.C < prev    next >
C/C++ Source or Header  |  1990-12-05  |  3KB  |  141 lines

  1. //$RcBoxShape,RcDiaStretcher$
  2. #include "RcBoxShape.h"
  3. #include "OvalShape.h"
  4.  
  5. //---- RcDia Stretcher ---------------------------------------------------------
  6.  
  7. class RcDiaStretcher: public DrawCommand {
  8.     RcBoxShape *rc;
  9.     Point newdia, olddia;
  10. public:
  11.     RcDiaStretcher(DrawView *dv, RcBoxShape *rc1) : DrawCommand(dv, 1, "set radius")
  12.     { rc= rc1; olddia= rc->GetDia(); }
  13.     Command *TrackMouse(TrackPhase atp, Point ap, Point, Point np);
  14.     void TrackFeedback(Point, Point, bool);
  15.     void DoIt()
  16.     { rc->SetDia(newdia); }
  17.     void UndoIt()
  18.     { rc->SetDia(olddia); }
  19.     void RedoIt()
  20.     { rc->SetDia(newdia); }
  21. };
  22.     
  23. Command *RcDiaStretcher::TrackMouse(TrackPhase atp, Point ap, Point pp, Point np)
  24. {
  25.     Command *cmd= DrawCommand::TrackMouse(atp, ap, pp, np);
  26.     newdia= olddia+2*delta;
  27.     newdia= Min(rc->bbox.extent, Max(gPoint0, newdia));
  28.     rc->SetDia(newdia, FALSE);
  29.     return cmd;
  30. }
  31.  
  32. void RcDiaStretcher::TrackFeedback(Point, Point, bool)
  33. {
  34.     Point p1= rc->bbox.NW(), p2= p1+newdia/2;
  35.     rc->Outline(p1, rc->bbox.SE());
  36.     GrLine(Point(p1.x, p2.y), p2);
  37.     GrLine(Point(p2.x, p1.y), p2);
  38. }
  39.  
  40. //---- Round Corner Box Shape Methods ------------------------------------------
  41.  
  42. static short RcBoxImage[]= {
  43. #   include  "images/RcBoxShape.im"
  44. };
  45.  
  46. MetaImpl(RcBoxShape, (T(rcdia), 0));
  47.  
  48. RcBoxShape::RcBoxShape()
  49. {
  50.     rcdia= max(2*pensize, 30);
  51. }
  52.  
  53. short *RcBoxShape::GetImage()
  54. {
  55.     return RcBoxImage;
  56. }
  57.  
  58. void RcBoxShape::SetSpan(Rectangle r)
  59. {
  60.     Shape::SetSpan(r);
  61.     rcdia= Min(rcdia, bbox.extent);
  62. }
  63.  
  64. void RcBoxShape::SetDia(Point d, bool redraw)
  65. {
  66.     rcdia= Min(d, bbox.extent);
  67.     if (redraw) {
  68.     Invalidate();
  69.     Changed();
  70.     }
  71. }
  72.  
  73. void RcBoxShape::Draw(Rectangle)
  74. {
  75.     GrFillRoundRect(bbox, rcdia);
  76.     GrStrokeRoundRect(bbox, rcdia);
  77. }
  78.  
  79. bool RcBoxShape::ContainsPoint(Point p)
  80. {
  81.     Point b= (bbox.extent-rcdia)/2;
  82.     p= Abs(p-bbox.Center()) - b;
  83.     if (! (p > gPoint0))
  84.     return TRUE;
  85.     if (Len(rcdia/2, p) <= 1.0) {
  86.     if (penink == 0)
  87.         return (bool) (Len(rcdia/2-(pensize+2), p) >= 1.0);
  88.     return TRUE;
  89.     }
  90.     return FALSE;
  91. }
  92.  
  93. Point *RcBoxShape::MakeHandles(int *n)
  94. {
  95.     BoxShape::MakeHandles(n);
  96.     spts[8]= spts[0]+rcdia/2;
  97.     (*n)++;
  98.     return spts;
  99. }
  100.  
  101. ShapeStretcher *RcBoxShape::NewStretcher(DrawView *dv, int handle)
  102. {
  103.     if (handle == 8)
  104.     return (ShapeStretcher*) new RcDiaStretcher(dv, this);
  105.     return BoxShape::NewStretcher(dv, handle);
  106. }
  107.  
  108. Point RcBoxShape::Chop(Point p)
  109. {
  110.     Point p1= p;
  111.     p= Shape::Chop(p);
  112.     Point pc= p - bbox.Center();
  113.     Point b= (bbox.extent-rcdia)/2;
  114.     if (! (Abs(pc) > b))
  115.     return p;
  116.     
  117.     Rectangle inner(bbox.Inset(rcdia.Half()));
  118.     int a= bbox.PointToAngle(p1-bbox.Center());
  119.     Rectangle ee(rcdia);
  120.     Point p3= ee.AngleToPoint(a) - ee.Center();
  121.     return bbox.Center() + inner.extent.Half() + p3;
  122. }
  123.  
  124. void RcBoxShape::Outline(Point p1, Point p2)
  125. {
  126.     Shape::Outline(p1, p2);
  127.     GrStrokeRoundRect(NormRect(p1, p2), rcdia);
  128. }
  129.  
  130. ostream& RcBoxShape::PrintOn(ostream& s)
  131. {
  132.     Shape::PrintOn(s);
  133.     return s << rcdia SP;
  134. }
  135.     
  136. istream& RcBoxShape::ReadFrom(istream& s)
  137. {
  138.     Shape::ReadFrom(s);
  139.     return s >> rcdia;
  140. }
  141.